<!DOCTYPE html
  PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- saved from url=(0014)about:internet -->
<html xmlns:MSHelp="http://www.microsoft.com/MSHelp/" lang="en-us" xml:lang="en-us"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<meta name="DC.Type" content="reference">
<meta name="DC.Title" content="C++11 Synchronization">
<meta name="DC.subject" content="C++11 Synchronization">
<meta name="keywords" content="C++11 Synchronization">
<meta name="DC.Relation" scheme="URI" content="../../reference/synchronization.htm">
<meta name="DC.Relation" scheme="URI" content="../general_conventions/namespaces.htm">
<meta name="DC.Format" content="XHTML">
<meta name="DC.Identifier" content="c_11_synchronization">
<meta name="DC.Language" content="en-US">
<link rel="stylesheet" type="text/css" href="../../intel_css_styles.css">
<title>C++11 Synchronization</title>
</head>
<body id="c_11_synchronization">
 <!-- ==============(Start:NavScript)================= -->
 <script src="..\..\NavScript.js" language="JavaScript1.2" type="text/javascript"></script>
 <script language="JavaScript1.2" type="text/javascript">WriteNavLink(2);</script>
 <!-- ==============(End:NavScript)================= -->
<a name="c_11_synchronization"><!-- --></a>


    <h1 class="topictitle1">C++11  Synchronization</h1>

    
<div><div class="section"><p>The Intel&reg; Threading Building Blocks (Intel&reg; TBB) library 
approximates a portion of C++11 interfaces for condition variables and scoped locking. The approximation is based on the C++11 working draft N3000. The major differences are:</p>

        <ul type="disc">
            <li><p>The implementation uses the <samp class="codeph">tbb::tick_count</samp> interface instead of the C++11 &lt;chrono&gt; interface. </p>
</li>

            <li><p>The implementation throws <samp class="codeph">std::runtime_error </samp>instead of a C++11 std::system_error.</p>
</li>

            <li><p>The implementation omits or approximates features requiring C++11 language support such as <samp class="codeph">constexpr</samp> or <samp class="codeph">explicit</samp> operators.</p>
</li>

            <li><p>The implementation works in conjunction with tbb::mutex wherever the C++11 specification calls for a <samp class="codeph">std::mutex</samp>. </p>
</li>

        </ul>

        <p>See the working draft N3000 for a detailed descriptions of the members.</p>

        <div class="Note"><h3 class="NoteTipHead">
					Caution</h3><p>Implementations may change if the C++11 specification changes. </p>
</div>
        <div class="Note"><h3 class="NoteTipHead">
					Caution</h3><p>When support for <samp class="codeph">std::system_error</samp> becomes available, implementations may throw <samp class="codeph">std::system_error</samp> instead of <samp class="codeph">std::runtime_error</samp>.</p>
</div>
        <p>The library defines the C++11 interfaces in namespace std, not namespace tbb, as explained in Section std Namespace.</p>

        </div>
<div class="section"><h2 class="sectiontitle">Header</h2>
        <pre>#include "tbb/compat/condition_variable"</pre>
        </div>
<div class="section"><h2 class="sectiontitle">Members</h2>
<pre>namespace std {
    &nbsp;&nbsp;&nbsp; struct defer_lock_t { }; 
    &nbsp;&nbsp;&nbsp; struct try_to_lock_t { }; 
    &nbsp;&nbsp;&nbsp; struct adopt_lock_t { }; 
    &nbsp;&nbsp;&nbsp; const defer_lock_t defer_lock = {};
    &nbsp;&nbsp;&nbsp; const try_to_lock_t try_to_lock = {};
    &nbsp;&nbsp;&nbsp; const adopt_lock_t adopt_lock = {};
    &nbsp;
    &nbsp;&nbsp;&nbsp; template&lt;typename M&gt;
    &nbsp;&nbsp;&nbsp; class lock_guard {
    &nbsp;&nbsp;&nbsp; public:
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef M mutex_type;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; explicit lock_guard(mutex_type&amp; m);
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lock_guard(mutex_type&amp; m, adopt_lock_t);
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~lock_guard();
    &nbsp;&nbsp;&nbsp; };
    &nbsp;
    &nbsp;&nbsp;&nbsp; template&lt;typename M&gt;
    &nbsp;&nbsp;&nbsp; class unique_lock: no_copy {
    &nbsp;&nbsp;&nbsp; public:
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef M mutex_type;
    &nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unique_lock();
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; explicit unique_lock(mutex_type&amp; m);
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unique_lock(mutex_type&amp; m, defer_lock_t);
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unique_lock(mutex_type&amp; m, try_to_lock_t));
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unique_lock(mutex_type&amp; m, adopt_lock_t);
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unique_lock(mutex_type&amp; m, const tick_count::interval_t &amp;i);
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~unique_lock();
    &nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void lock();
    &nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool try_lock();
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool try_lock_for( const tick_count::interval_t &amp;i );
    &nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void unlock();
    &nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void swap(unique_lock&amp; u);
    &nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mutex_type* release();
    &nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool owns_lock() const;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; operator bool() const;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mutex_type* mutex() const;
    &nbsp;&nbsp;&nbsp; };
    &nbsp;
    &nbsp;&nbsp;&nbsp; template&lt;typename M&gt;
    &nbsp;&nbsp;&nbsp; void swap(unique_lock&lt;M&gt;&amp; x, unique_lock&lt;M&gt;&amp; y);
    &nbsp;
    &nbsp;&nbsp;&nbsp; enum cv_status {no_timeout, timeout};
    &nbsp;
    &nbsp;&nbsp;&nbsp; class condition_variable : no_copy {
    &nbsp;&nbsp;&nbsp; public:
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; condition_variable();
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~condition_variable();
    &nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void notify_one();
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void notify_all();
    &nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void wait(unique_lock&lt;mutex&gt;&amp; lock);
    &nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; template &lt;class Predicate&gt;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void wait(unique_lock&lt;mutex&gt;&amp; lock, Predicate pred);
    &nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cv_status wait_for(unique_lock&lt;mutex&gt;&amp; lock, 
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const tick_count::interval_t&amp; i);
    &nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; template&lt;typename Predicate&gt;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool wait_for(unique_lock&lt;mutex&gt;&amp; lock, 
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const tick_count::interval_t &amp;i, 
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Predicate pred);
    &nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef <em>implementation-defined</em> native_handle_type;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; native_handle_type native_handle();
    &nbsp;&nbsp;&nbsp; };
    } // namespace std
    &nbsp;</pre></div>
</div>
 
<div class="familylinks">
<div class="parentlink"><strong>Parent topic:</strong>&nbsp;<a href="../../reference/synchronization.htm">Synchronization</a></div>
</div>
<div class="See Also">
<h2>See Also</h2>
<div class="linklist">
<div><a href="../general_conventions/namespaces.htm">Namespace std</a></div></div>
</div>
</body>
</html>
